function [t, y] = rk4_fixed_step_stop(f, tspan, y0, h, stop_cond)
    % RK4 定步长函数，带终止条件
    % 输入:
    %   f         - 函数句柄，表示 dy/dt = f(t, y)
    %   tspan     - 时间区间 [t0, tf]
    %   y0        - 初值向量
    %   h         - 固定步长
    %   stop_cond - 终止条件函数句柄 (可选)，格式 @(t, y) -> boolean
    % 输出:
    %   t         - 时间点数组
    %   y         - 每个时间点对应的解数组

    % 初始化时间向量
    t0 = tspan(1);
    tf = tspan(2);
    t = t0:h:tf;

    % 初始化解矩阵
    n = length(t);
    y = zeros(length(y0), n);
    y(:, 1) = y0;

    % 迭代计算每个时间点的解
    for i = 1:n-1
        % 当前时间和解
        ti = t(i);
        yi = y(:, i);

        % 计算 RK4 的 k1, k2, k3, k4
        k1 = f(ti, yi);
        k2 = f(ti + h/2, yi + h/2 * k1);
        k3 = f(ti + h/2, yi + h/2 * k2);
        k4 = f(ti + h, yi + h * k3);

        % 更新解
        y(:, i+1) = yi + h/6 * (k1 + 2*k2 + 2*k3 + k4);
        
        % 终止条件判断
        if nargin >= 5 && stop_cond(t(i+1), y(:, i+1))
            t = t(1:i+1)';
            y = y(:, 1:i+1)';
            return;
        end
    end

    % 转置结果，使输出与 MATLAB 的 ode 系列一致
    t = t';
    y = y';
end
